// 导入 Sequelize 的数据类型模块，用于定义模型字段类型
const { DataTypes } = require("sequelize");
// 导入数据库连接实例（已配置好的 Sequelize 连接）
const sequelize = require("../config/db");

// 定义 Equipment 模型（对应数据库中的 equipment 表）
const Equipment = sequelize.define(
  "Equipment", // Sequelize 内部模型名（大写开头,约定俗成）
  {
    equipmentId: {
      type: DataTypes.INTEGER, // 整数类型
      primaryKey: true, // 设为主键
      autoIncrement: true, // 自动递增
      allowNull: false, // 非空
      field: "equipment_id", // 映射数据库中的字段名(下划线命名)
      comment: "设备 ID，主键", // 字段注释
    },
    equipmentTemplateId: {
      type: DataTypes.INTEGER,
      allowNull: false,
      field: "equipment_template_id",
      comment: "关联设备模板 ID",
    },
    name: {
      type: DataTypes.STRING(100), // 字符串类型，最大长度 100
      allowNull: false,
      comment: "设备名称",
    },
    description: {
      type: DataTypes.STRING(500), // 字符串类型，最大长度 500
      allowNull: true, // 可空
      comment: "设备描述",
    },
    picUrl: {
      type: DataTypes.STRING(255), // 字符串类型，最大长度 255
      allowNull: true,
      field: "pic_url",
      comment: "设备图片 URL",
    },
    lastCollectTime: {
      type: DataTypes.DATE, // 日期时间类型
      allowNull: true,
      field: "last_collect_time",
      comment: "最后一次采集时间",
    },
    healthStatus: {
      type: DataTypes.TINYINT, // tinyint 类型（1字节整数，范围-128~127）
      allowNull: false,
      defaultValue: 0, // 默认值为 0（正常）
      field: "health_status",
      comment: "健康状态（0：正常，1：一级报警，2：二级报警，3：三级报警）",
    },
    equipmentType: {
      type: DataTypes.TINYINT,
      allowNull: false,
      defaultValue: 0,
      field: "equipment_type",
      comment: "设备类型",
    },
    modeOfMotion: {
      type: DataTypes.STRING(500),
      allowNull: true,
      field: "mode_of_motion",
      comment: "运动方式",
    },
    kineticCharacteristic: {
      type: DataTypes.STRING(500),
      allowNull: true,
      field: "kinetic_characteristic",
      comment: "运动特性",
    },
    runningVelocity: {
      type: DataTypes.DECIMAL(10, 2), // 十进制数值类型，最多 10 位，其中小数点后 2 位
      allowNull: true,
      field: "running_velocity",
      comment: "转子速度",
    },
    loadProperty: {
      type: DataTypes.STRING(200),
      allowNull: true,
      field: "load_property",
      comment: "载荷性质",
    },
    surrounding: {
      type: DataTypes.STRING(200),
      allowNull: true,
      comment: "周围环境",
    },
    gradeOfEquipment: {
      type: DataTypes.STRING(100),
      allowNull: true,
      field: "grade_of_equipment",
      comment: "设备等级",
    },
    standby: {
      type: DataTypes.TINYINT,
      allowNull: false,
      defaultValue: 0,
      comment: "是否有备机",
    },
    createUserId: {
      type: DataTypes.INTEGER,
      allowNull: false,
      field: "create_user_id",
      comment: "创建人 ID",
    },
    createTime: {
      type: DataTypes.DATE, // 日期时间类型
      allowNull: false, // 非空
      defaultValue: DataTypes.NOW, // 默认值为当前时间
      field: "create_time",
      comment: "设备创建时间",
    },
  },
  {
    tableName: "equipment", // 显式指定数据库表名（小写,与表名一致）
    freezeTableName: true, // 禁止 Sequelize 自动将表名复数化
    timestamps: false, // 不自动生成 createdAt 和 updatedAt 字段
    comment: "设备表",
    // 定义表索引(优化查询性能)
    indexes: [
      {
        fields: ["last_collect_time"],
        name: "idx_eq_last_collect_time",
        // 用途：优化查询长期未采集数据的设备
      },
      {
        fields: ["health_status"],
        name: "idx_eq_health_status",
        // 用途：优化按健康状态筛选设备（如查询所有报警设备）
      },
      {
        fields: ["equipment_template_id"],
        name: "fk_eq_equipment_template_id",
        // 用途：优化关联查询设备模板的场景
      },
      {
        fields: ["create_user_id"],
        name: "fk_eq_create_user_id",
        // 用途：优化按创建人查询设备的场景
      },
    ],
  }
);

// 导出模型供其他模块使用
module.exports = Equipment;
